]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
keyboard: Fix backspace not getting released after deleting preedit
authorSebastian Keller <skeller@gnome.org>
Wed, 8 Nov 2023 09:46:52 +0000 (10:46 +0100)
committerSebastian Keller <skeller@gnome.org>
Wed, 8 Nov 2023 14:01:10 +0000 (15:01 +0100)
When deleting is toggled while a preedit string is present, this causes
_toggleDelete() to use keyvalPress(). After the entire preedit string
has been deleted, _toggleDelete() will no longer hit the code path that
would call keyvalRelease() due to hasPreedit() now being false.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7171
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3009>

js/ui/keyboard.js

index 3adf230fddc17f9e963ef9dbf22708f97f5b9bbe..fb39b2d1fed10a36f567d7ce428174d44f43b07c 100644 (file)
@@ -1641,15 +1641,20 @@ export const Keyboard = GObject.registerClass({
         this._deleteEnabled = enabled;
         this._timesDeleted = 0;
 
-        if (!Main.inputMethod.currentFocus ||
-            Main.inputMethod.hasPreedit() ||
-            Main.inputMethod.terminalMode) {
-            /* If there is no IM focus or are in the middle of preedit,
-             * fallback to keypresses */
-            if (enabled)
-                this._keyboardController.keyvalPress(Clutter.KEY_BackSpace);
-            else
-                this._keyboardController.keyvalRelease(Clutter.KEY_BackSpace);
+        /* If there is no IM focus or are in the middle of preedit, fallback to
+         * keypresses */
+        if (enabled &&
+            (!Main.inputMethod.currentFocus ||
+             Main.inputMethod.hasPreedit() ||
+             Main.inputMethod.terminalMode)) {
+            this._keyboardController.keyvalPress(Clutter.KEY_BackSpace);
+            this._backspacePressed = true;
+            return;
+        }
+
+        if (!enabled && this._backspacePressed) {
+            this._keyboardController.keyvalRelease(Clutter.KEY_BackSpace);
+            delete this._backspacePressed;
             return;
         }